import type { SysDict } from '@/apis/system/sysDictApi'
import { useDictStore } from '@/stores/dictStore'

export type DataColorType = 'primary' | 'success' | 'warning' | 'info' | 'danger'

export interface DataFieldOption {
  label: string
  value: string | number
  tagType?: DataColorType
  tagColor?: string
  children?: DataFieldOption[]
  disabled?: boolean
}

export interface DataFieldDict {
  dictCode: string
  dictFilter?: (data: SysDict) => boolean
  checkStrictly?: boolean
}

/**
 * 基本字段信息
 */
export interface DataBaseField {
  /** 字段名称 */
  name: string
  /** 字段标题 */
  title: string
  /** 字段类型 */
  type?: 'string' | 'number' | 'boolean' | 'date' | 'datetime'
  /** 字段选项 */
  options?: DataFieldOption[]
  /** 字典编码 */
  dict?: DataFieldDict | string
  /** 是否展示 */
  show?: boolean | ((data: any) => boolean)
}

/**
 * 数据字段列信息
 */
export interface DataColumnField {
  /** 列类型 */
  columnType?: 'KEY' | 'MAIN' | undefined
  /** 是否列过滤 */
  columnFilter?: boolean
  /** 字段宽度 */
  width?: number
  /** 对齐方式 */
  align?: string
  /** 是否排序 */
  sort?: boolean
  /** 点击事件 */
  click?: (data: any) => void
}

export type DataFieldEditType = 'select' | 'button' | 'radio' | 'number' | 'icon' | 'operator'

/**
 * 数据字段编辑信息
 */
export interface DataEditField {
  /** 是否可编辑 */
  edit?: boolean | ((data: any, index?: number) => boolean)
  /** 编辑类型 */
  editType?: DataFieldEditType
  /** 提示 */
  tip?: string
  /** 输入框占位信息 */
  placeholder?: string
  /** 是否必填 */
  require?: boolean
  /** 最小长度 */
  minLength?: number
  /** 最大长度 */
  maxLength?: number
  /** 正则匹配 */
  pattern?: string | RegExp
  /** 最小值 */
  minValue?: number
  /** 最大值 */
  maxValue?: number

  /** 提示 */
  checkStrictly?: boolean
  /** 提示 */
  validator?: (value: any, data?: any) => string | undefined
  /** 提示 */
  change?: (value: any, data: any) => void
}

export interface DataFormField extends DataBaseField, DataEditField {

}

export interface DataField extends DataBaseField, DataColumnField, DataEditField {

}

export async function useDictOption(field: DataBaseField) {
  if (field.options !== undefined || field.dict === undefined) {
    return
  }
  const dict: DataFieldDict = (typeof field.dict === 'string') ? { dictCode: field.dict } : field.dict
  const dictStore = useDictStore()
  await dictStore.loadDict(dict.dictCode)
}
